package com.hemerasolutions.v2trainer.service.interfaces;

import java.util.List;
import java.util.Map;

import com.hemerasolutions.v2trainer.model.exercise.Exercise;
import com.hemerasolutions.v2trainer.model.exercise.executions.Execution;
import com.hemerasolutions.v2trainer.model.exercise.intensity.IntensityModZone;
import com.hemerasolutions.v2trainer.model.exercise.intensity.IntensityZone;
import com.hemerasolutions.v2trainer.model.modality.Modality;
import com.hemerasolutions.v2trainer.model.modality.VersionableModality;
import com.hemerasolutions.v2trainer.model.multimedia.Photo;
import com.hemerasolutions.v2trainer.model.multimedia.Video;
import com.hemerasolutions.v2trainer.model.muscle.BodyRegion;
import com.hemerasolutions.v2trainer.model.screen.Reference;
import com.hemerasolutions.v2trainer.model.training.Training;
import com.hemerasolutions.v2trainer.model.training.TrainingType;
import com.hemerasolutions.v2trainer.model.unit.intensity.Rpe;
import com.hemerasolutions.v2trainer.model.unit.volume.VolumeType;
import com.hemerasolutions.v2trainer.service.ExceptionService;

public interface ModalityServiceInterface extends BaseServiceInterface {

	public abstract List<TrainingType> listTrainingTypes();

	public abstract List<BodyRegion> listBodyRegion();
	
	public abstract Modality saveModality(Modality modality) throws ExceptionService;

	public abstract Modality createModality(Modality modality) throws ExceptionService;

	public abstract Modality readModality(Modality modality);

	public abstract void deleteVersionableModality(VersionableModality versionableModality) throws ExceptionService;
	
	public abstract List<BodyRegion> listBodyRegions();

	public abstract Photo readDefaultExercisePhoto();

	public abstract Video readDefaultVideo();

	public abstract List<Modality> searchModalitys(Map<String, Object> fields);

	public abstract List<Exercise> searchExercises(Map<String, Object> fields);

	public abstract List<Rpe> listAllRpes();

	boolean hasChanged(Modality modality);

	public abstract List<Training> trainingsUsing(Modality modality, VolumeType vt);

	public abstract List<Training> trainingsUsing(Modality modality, Execution ex);

	public abstract List<Training> trainingsUsing(IntensityModZone imz);

	public abstract List<Training> trainingsUsing(IntensityZone iz);

	public abstract	List<Training> trainingsUsing(Modality modality);

	public abstract List<Training> trainingsUsingIzs(List<IntensityZone> izs);

	public abstract List<Training> trainingsUsing(Exercise exercise);

	public abstract List<Training> trainingsUsingExercises(List<Exercise> exercises);

	public abstract Exercise getExerciseById(int id);

	VersionableModality createModality(VersionableModality vModality);

	List<VersionableModality> searchVersionableModalitys(
			Map<String, Object> fields);


	public abstract VersionableModality saveVersionableModality(
			VersionableModality versionableModality) throws ExceptionService;

	public abstract VersionableModality createVersionableModality(
			VersionableModality versionableModality)throws ExceptionService;

	public abstract VersionableModality readVersionableModality(
			VersionableModality versionableModality);

	void deleteModality(Modality modality) throws ExceptionService;

	List<Reference> getReferences(Modality modality);

}
